iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0
Modern Web

Nest.js framework 30天初探系列 第 18

Nestjs framework 30天初探:Day18 SQL (Sequelize) 完結

  • 分享至 

  • xImage
  •  
  1. 還沒建立資料表的大大們,請先建立資料表。
    SQL Script
USE [IronManNest]
GO

/****** Object:  Table [dbo].[Users]    Script Date: 2017/12/20 下午 10:47:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Users](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Age] [int] NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Create

  1. Day17 我們將interface IUsersService註解掉create()、update()、delete(),接下來我們逐步去掉註解,先對create()註解取消掉。
    src/app/Users/interfaces/IUsers.service.ts
'use strict';

import { Users } from '../users.entity';
import { IUsers } from './IUsers';

export interface IUsersService {
    findAll(): Promise<Array<Users>>;
    findById(ID: number): Promise<Users | null>;
    findOne(options: Object): Promise<Users | null>;
    create(users: IUsers): Promise<Users>;
    //update(ID: number, newValue: IUsers): Promise<Users | null>;
    //delete(ID: number): Promise<number>;
}
  1. UsersServices 新增create()。
    src/app/Users/users.service.ts
    部分程式碼:
public async create(users: IUsers): Promise<Users> {
        return await this.usersRepository.create<Users>(users);
    }
  1. 再將UsersController新增一個createUser()方法。
    src/app/Users/modules/users.controller.ts
@Post('users')
    public async createUser( @Response() res, @Body() body) {
    
        const users = await this.usersServices.create(body);
        return res.status(HttpStatus.OK).json(users);
    }
  1. 打開Postman,對http://localhost:3000/users 做POST請求。
    https://ithelp.ithome.com.tw/upload/images/20171221/20107195joCvTrdomf.png

Update

  1. 將interface IUsersService的update()取消註解。
    src/app/Users/interfaces/IUsers.service.ts
'use strict';

import { Users } from '../users.entity';
import { IUsers } from './IUsers';

export interface IUsersService {
    findAll(): Promise<Array<Users>>;
    findById(ID: number): Promise<Users | null>;
    findOne(options: Object): Promise<Users | null>;
    create(users: IUsers): Promise<Users>;
    update(ID: number, newValue: IUsers): Promise<Users | null>;
    //delete(ID: number): Promise<number>;
}
  1. UsersService()新增一個update()方法。
    src/app/Users/users.service.ts
public async update(ID: number, newValue: IUsers): Promise<Users | null> {

        //先找出單筆資料
        let user = await this.usersRepository.findById<Users>(ID);
        //該筆資料不存在
        if (!user.ID) {
            console.error("user doesn't exist");
        }
        //覆寫過的user物件
        user = this._assign(user, newValue);
        //呼叫user Model的方法
        return await user.save({ returning: true });
    }
    //將新資料物件與舊資料物件做逐一屬性值比對,不一樣就覆寫舊資料物件的值。
    private _assign(user: IUsers, newValue: IUsers): Users {
        //遍歷舊資料屬性,資料在dataValues屬性裡
        for (const key of Object.keys(user["dataValues"])) {
            //兩個物件同屬性不同值
            if (user[key] !== newValue[key]) {
                //覆寫舊資料物件,給予新資料物件的值
                user[key] = newValue[key];
            }
        }
        //返回一個user Model
        return user as Users;
    }
  1. 再將UsersController新增一個createUser()方法。
    src/app/Users/modules/users.controller.ts
@Patch('users/:ID')
    public async updateUser( @Param() param, @Response() res, @Body() body) {

        const users = await this.usersServices.update(param.ID,body);
        return res.status(HttpStatus.OK).json(users);
    }
  1. 請再新增一筆資料來玩,請打開Postman,對http://localhost:3000/users 做POST請求。
    https://ithelp.ithome.com.tw/upload/images/20171221/20107195iKNcDADtxX.png
  2. 請打開Postman,對http://localhost:3000/users/5 做PATCH請求。
    https://ithelp.ithome.com.tw/upload/images/20171221/20107195QROhbD567g.png

Delete

  1. 將interface IUsersService的delete()取消註解。
    src/app/Users/interfaces/IUsers.service.ts
'use strict';

import { Users } from '../users.entity';
import { IUsers } from './IUsers';

export interface IUsersService {
    findAll(): Promise<Array<Users>>;
    findById(ID: number): Promise<Users | null>;
    findOne(options: Object): Promise<Users | null>;
    create(users: IUsers): Promise<Users>;
    update(ID: number, newValue: IUsers): Promise<Users | null>;
    delete(ID: number): Promise<number>;
}
  1. UsersService()新增一個delete()方法。
    src/app/Users/users.service.ts
public async delete(ID: number): Promise<number> {
        //成功會回傳1,失敗回傳0
        return await this.usersRepository.destroy({
            where: { ID }
        })
    }
  1. 再將UsersController新增一個deleteUser()方法。
    src/app/Users/modules/users.controller.ts
@Delete('users/:ID')
    public async deleteUser( @Param() param, @Response() res) {

        const users = await this.usersServices.delete(param.ID);
        return res.status(HttpStatus.OK).json(users);
    }
  1. 請打開Postman,對http://localhost:3000/users/2 做DELETE請求。
    https://ithelp.ithome.com.tw/upload/images/20171221/20107195fFG9ZX9EzZ.png

功德圓滿,CRUD都會了。

程式碼都在github


上一篇
Nestjs framework 30天初探:Day17 SQL (Sequelize) PART 2
下一篇
Nestjs framework 30天初探:Day19 Swagger
系列文
Nest.js framework 30天初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言